package com.enzoism.springboot.dive.lambda;

import com.enzoism.springboot.dive.model.UsrModel;

import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class A02GroupBy {
    public static void main(String[] args) {
        List<UsrModel> usrList = UsrModel.initList();
        // 场景一：基础GroupBy使用
        基础GroupBy使用(usrList);

        // 场景二：基础GroupBy使用_对统计的List进行属性求和
        基础GroupBy使用_对统计的List进行属性求和(usrList);
        基础GroupBy使用_对统计的List进行属性平均值(usrList);

        // 场景三：基础GroupBy使用_统计分组的个数
        基础GroupBy使用_统计分组的个数(usrList);

        // 场景四：Map基础Value进行排序_放入Map时保持放入顺序
        Map基础Value进行排序_放入Map时保持放入顺序();

        // 场景五：多个属性拼接出一个组合属性(同理可以自己定义-非常有用)
        多个属性拼接出一个组合属性(usrList);

        // 场景六：嵌套GroupBy
        嵌套GroupBy(usrList);

        // 场景六：基础GroupBy使用_mapping收集指定属性
        基础GroupBy使用_mapping收集指定属性(usrList);
        基础GroupBy使用_mapping收集指定属性_使用Join(usrList);
        基础GroupBy使用_mapping收集指定属性_使用Join(usrList);

    }

    private static void 基础GroupBy使用(List<UsrModel> usrList) {
        Map<String, List<UsrModel>> collect = usrList.stream().collect(Collectors.groupingBy(UsrModel::getUsrId));
        for (Map.Entry<String, List<UsrModel>> stringListEntry : collect.entrySet()) {
            System.out.println(stringListEntry.getKey() + "--->" + stringListEntry.getValue());
        }
    }

    private static void 基础GroupBy使用_对统计的List进行属性求和(List<UsrModel> usrList) {
        Map<String, Long> collect = usrList.stream().collect(Collectors.groupingBy(UsrModel::getUsrId, Collectors.summingLong(UsrModel::getUsrNum)));
        System.out.println("--->分组后_对统计的List进行属性求和:" + collect);
    }
    private static void 基础GroupBy使用_对统计的List进行属性平均值(List<UsrModel> usrList) {
        Map<String, Double> collect = usrList.stream().collect(Collectors.groupingBy(UsrModel::getUsrId, Collectors.averagingLong(UsrModel::getUsrNum)));
        System.out.println("--->分组后_对统计的List进行属性平均值:" + collect);
    }

    private static void 基础GroupBy使用_统计分组的个数(List<UsrModel> usrList) {
        Map<String, Long> collect = usrList.stream().collect(Collectors.groupingBy(UsrModel::getUsrId, Collectors.counting()));
        System.out.println("--->分组后_统计分组的个数:" + collect);
    }

    private static void Map基础Value进行排序_放入Map时保持放入顺序() {
        // 模拟String列表
        List<String> items = Arrays.asList("apple", "apple", "banana", "apple", "orange", "banana", "papaya");

        // 转化为Map对象
        Map<String, Long> result2 = items.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        // Map基础Value进行排序-放入Map时保持放入顺序
        Map<String, Long> finalMap = new LinkedHashMap<>();
        result2.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed()).forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));

        for (Map.Entry<String, Long> stringListEntry : finalMap.entrySet()) {
            System.out.println(stringListEntry.getKey() + "--->" + stringListEntry.getValue());
        }
    }

    private static void 多个属性拼接出一个组合属性(List<UsrModel> usrList) {
        Map<String, Long> collect = usrList.stream().collect(Collectors.groupingBy(item -> item.getUsrId() + "_" + item.getUsrNum(), Collectors.counting()));
        System.out.println("--->多个属性拼接出一个组合属性:" + collect);
    }


    private static void 嵌套GroupBy(List<UsrModel> usrList) {
        Map<String, Map<Long, List<UsrModel>>> collect = usrList.stream().collect(Collectors.groupingBy(UsrModel::getUsrId,
                Collectors.groupingBy(UsrModel::getUsrNum)));
        System.out.println("--->多个属性拼接出一个组合属性:" + collect);
    }

    private static void 基础GroupBy使用_mapping收集指定属性(List<UsrModel> usrList) {
        Map<String, List<String>> collect = usrList.stream().collect(Collectors.groupingBy(UsrModel::getUsrId, Collectors.mapping(UsrModel::getUsrId, Collectors.toList())));
        System.out.println("--->分组后_mapping收集指定属性:" + collect);
    }
    private static void 基础GroupBy使用_mapping收集指定属性_使用Join(List<UsrModel> usrList) {
        Map<String, String> collect = usrList.stream().collect(Collectors.groupingBy(UsrModel::getUsrId, Collectors.mapping(UsrModel::getUsrId,Collectors.joining("_"))));
        System.out.println("--->分组后_使用Join:" + collect);
    }
    private static void 基础GroupBy使用_mapping收集指定属性_使用Join多参数(List<UsrModel> usrList) {
        Map<String, String> collect = usrList.stream().collect(Collectors.groupingBy(UsrModel::getUsrId, Collectors.mapping(UsrModel::getUsrId,Collectors.joining("_", "UsrId: [", "]"))));
        System.out.println("--->分组后_使用Join多参数:" + collect);
    }

}
